package com.glela.common.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import com.glela.common.constant.BaseConstants;

public final class DateUtil {
	public static DateTimeFormatter	DATE_FORMATTER					= DateTimeFormat.forPattern(BaseConstants.DATE_FORMAT);
	public static DateTimeFormatter	DATE_FORMATTER_YYYYMMDDHHMMSS	= DateTimeFormat.forPattern(BaseConstants.DATE_FORMAT_YYYYMMDDHHMMSS);
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	/**
	 * <dl>
	 * <dt>当前时间</dt>
	 * <dd>格式：yyyy-MM-dd HH:mm:ss</dd>
	 * </dl>
	 * @return String
	 * @author zls
	 * @date 2017年10月21日 下午1:57:41
	 */
	public static String getNow() {
		return new DateTime().toString(BaseConstants.DATE_FORMAT);
	}

	public static String getNowSSS() {
		return new DateTime().toString(BaseConstants.DATE_FORMAT_SSS);
	}

	/**
	 * 返回前N个月的日期值
	 * 
	 * @param month
	 * @return
	 */
	public static Date getLastMonth(String month) {
		Calendar ca = Calendar.getInstance();
		int m = 0;
		try {
			m = Integer.parseInt(month);
		} catch (NumberFormatException e) {
			e.printStackTrace();
		}
		ca.add(Calendar.MONTH, -m);
		return ca.getTime();
	}

	/**
	 * 获取当前日期是星期几-英文
	 * 
	 * @return
	 */
	public static String getDate() {
		Date date = new Date();
		java.text.SimpleDateFormat f = new java.text.SimpleDateFormat("E", Locale.US);
		return f.format(date).substring(0, 2);
	}

	/**
	 * 获取某天后的日期
	 * 
	 * @param day
	 * @return
	 */
	public static String getFewDays(int day) {
		Date date = new Date();
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE, day);
		return (new SimpleDateFormat(BaseConstants.DATE_FORMAT)).format(cal.getTime());
	}

	/**
	 * 
	 * **********************************************
	 * @Title: getFewDays
	 * @Description: (这里用一句话描述这个方法的作用)
	 * @param @param date 开始日期
	 * @param @param day N天后
	 * @param @return
	 * @return String
	 * @throws @author NingChongQing
	 * @date 2017年11月15日 下午4:59:42 **********************************************
	 */
	public static String getFewDays(Date date, int day) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE, day);
		return (new SimpleDateFormat(BaseConstants.DATE_FORMAT)).format(cal.getTime());
	}

	/**
	 * 获取时间分钟差
	 * 
	 * @param day
	 * @return
	 */
	public static long getMinuteDiff(Date dateStart, Date dateEnd) {
		long days = 0;
		try {
			long diff = dateEnd.getTime() - dateStart.getTime();
			days = diff / (1000 * 60);
		} catch (Exception e) {}
		return days;
	}

	/**
	 * 获得系统当前时间(按用户自己格式)
	 * 
	 * @return java.util.Date
	 */
	public static String currentYourDate(String formate) {
		Date date = new Date();
		return toString(date, formate);
	}

	/**
	 * 获得系统当前时间，格式(yyyy-MM-dd HH:mm:ss)
	 * 
	 * @return java.util.Date
	 */
	public static String currentStringDate() {
		Date date = new Date();
		return toString(date);
	}

	/**
	 * 默认将日期转换为字符串，格式(yyyy-MM-dd HH:mm:ss)
	 * 
	 * @param date
	 * @return String
	 */
	public static String toString(java.util.Date date) {
		return toString(date, BaseConstants.DATE_FORMAT);
	}

	/**
	 * 根据给定的格式化参数，将日期转换为字符串
	 * 
	 * @param date 时间
	 * @param dateFormat 时间格式
	 * @return String
	 */
	public static String toString(java.util.Date date, String dateFormat) {
		if (date == null) {
			return "bug: date is null";
		}
		DateFormat sdf = new SimpleDateFormat(dateFormat);
		String str = sdf.format(date);
		return str;
	}

	/**
	 * 将日期转换为长整型
	 * 
	 * @param date 时间
	 * @return long
	 */
	public static long toLong(java.util.Date date) {
		if (date == null) {
			return 0;
		}
		long d = date.getTime();
		return d;
	}

	/**
	 * 将长整型转换为日期对象
	 * 
	 * @param time
	 * @return date
	 */
	public static java.util.Date toDate(long time) {
		if (time == 0) {
			return new Date();
		}
		Date date = new Date(time);
		return date;
	}

	/**
	 * 返回当前周几
	 * 
	 * @param date
	 * @return
	 */
	public static int getWeekDay() {
		Calendar calendar = Calendar.getInstance();
		return calendar.get(Calendar.DAY_OF_WEEK);
	}

	/**
	 * 根据输入的日期返回周几
	 * 
	 * @param date
	 * @return
	 */
	public static int toWeekDay(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.DAY_OF_WEEK);
	}

	/**
	 * 将时间类型转换为yyyy-MM-dd字符串
	 * 
	 * @param date 时间
	 * @return
	 */
	public static String toDateStr(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(date);
	}

	/**
	 * 返回这个日期是星期几
	 * 
	 * @param date 日期
	 * @return
	 */
	public static String toChineseWeekDay(Date date) {
		String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int w = calendar.get(Calendar.DAY_OF_WEEK) - 1;
		if (w < 0) {
			w = 0;
		}
		return weekDays[w];
	}

	/**
	 * 根据输入日期 返回 时分秒（HH:mm:ss）
	 * 
	 * @param date
	 * @return
	 */
	public static String toTimeStr(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
		return sdf.format(date);
	}

	/**
	 * 根据给定的格式化参数，将字符串转换为日期
	 * 
	 * @param dateString 时间字符串
	 * @param dateFormat 时间格式
	 * @return java.util.Date
	 */
	public static java.util.Date parse(String dateString, String dateFormat) {
		if (dateString == null || "".equals(dateString.trim()) || "".equals(dateFormat.trim())) {
			return null;
		}
		DateFormat sdf = new SimpleDateFormat(dateFormat);
		Date date = null;
		try {
			date = sdf.parse(dateString);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return date;
	}

	/**
	 * 将字符串转换为日期 根据默认格式（yyyy-MM-dd HH:mm:ss）
	 * 
	 * @param dateString 时间字符串
	 * @return
	 */
	public static java.util.Date parse(String dateString) {
		return parse(dateString, BaseConstants.DATE_FORMAT);
	}

	/**
	 * 获得明天日期 ，返回时间格式为yyyy-MM-dd
	 * 
	 * @return String
	 */
	public static String getNextDate() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(new Date(System.currentTimeMillis() + 24 * 60 * 60000));
	}

	public static String getNextDateFull() {
		SimpleDateFormat sdf = new SimpleDateFormat(BaseConstants.DATE_FORMAT);
		return sdf.format(new Date(System.currentTimeMillis() + 24 * 60 * 60000));
	}

	/**
	 * 获得昨天日期 ，返回时间格式为yyyy-MM-dd
	 * 
	 * @return String
	 */
	public static String getYesterdayDate() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(new Date(System.currentTimeMillis() - 24 * 60 * 60000));
	}

	/**
	 * 根据传入开始时间和结束时间、当前时间 、时间格式 来判断 当前时间是否在 开始时间和结束时间之间 所有传入的时间 都必须按照 指定的时间格式进行处理
	 * 
	 * @param startDate 开始日期
	 * @param endDate 结束日期
	 * @param currentTime 当前时间
	 * @param dateFormat 时间格式
	 * @return 0 为不在这个区间 ;1位在这个区间
	 */
	public static int betweenTime(String startDate, String endDate, String currentTime, String dateFormat) {
		int i = 0;
		Date start = parse(startDate, dateFormat);
		Date end = parse(endDate, dateFormat);
		Date current = parse(currentTime, dateFormat);
		long startTime = toLong(start);
		long endTime = toLong(end);
		long newdate = toLong(current);
		if (startTime <= newdate && endTime >= newdate) {
			i = 1;
		}
		return i;
	}
	public static Long betweenTimeSeconds(String startDate, String endDate) {
		Date start = parse(startDate, BaseConstants.DATE_FORMAT);
		Date end = parse(endDate, BaseConstants.DATE_FORMAT);
		long startTime = toLong(start);
		long endTime = toLong(end);
		return (startTime-endTime)/1000;
	}

	/**
	 * 根据传入开始时间和结束时间， 来判断 当前时间（系统当前时间）是否在 开始时间和结束时间之间 所有传入的时间 都必须按照 指定的时间格式（默认格式 yyyy-MM-dd HH:mm:ss）进行处理
	 * 
	 * @param startDate 开始日期
	 * @param endDate 结束日期
	 * @return 0 为不在这个区间 ;1位在这个区间
	 */
	public static int betweenTime(String startDate, String endDate) {
		return betweenTime(startDate, endDate, currentStringDate(), BaseConstants.DATE_FORMAT);
	}

	/**
	 * 获取当前年
	 * 
	 * @return
	 */
	public static int getYear() {
		Calendar ca = Calendar.getInstance();
		ca.setTime(new Date());
		int value = ca.get(Calendar.YEAR);
		ca.get(Calendar.YEAR);
		return value;
	}

	/**
	 * 获取当前月
	 * 
	 * @return
	 */
	public static int getMonth() {
		Calendar ca = Calendar.getInstance();
		ca.setTime(new Date());
		int value = ca.get(Calendar.MONTH) + 1;
		return value;
	}

	/**
	 * 获取当前日
	 * 
	 * @return
	 */
	public static int getDay() {
		Calendar ca = Calendar.getInstance();
		ca.setTime(new Date());
		int value = ca.get(Calendar.DAY_OF_MONTH);
		return value;
	}

	/**
	 * 获得day天后的时间
	 * 
	 * @param day
	 * @return yyyy-MM-dd
	 */
	public static String addDay(int day) {
		Calendar ca = Calendar.getInstance();
		ca.setTime(new Date());
		ca.add(Calendar.DAY_OF_YEAR, day);
		return toString(ca.getTime(), "yyyy-MM-dd");
	}

	/**
	 * 得到指定天数
	 * @param args
	 * @return
	 * @throws ParseException 
	 */
	public static String getAccurateDays(String startDate, int days) throws ParseException {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(sdf.parse(startDate));
		calendar.add(Calendar.DAY_OF_MONTH, + 7);
		return sdf.format(calendar.getTime());
	}
	
	/**
	 * 获得day天后的时间
	 * 
	 * @param day
	 * @return yyyy-MM-dd
	 */
	public static String addDayToLongString(int day) {
		Calendar ca = Calendar.getInstance();
		ca.setTime(new Date());
		ca.add(Calendar.DAY_OF_YEAR, day);
		return toString(ca.getTime(), BaseConstants.DATE_FORMAT);
	}

	/**
	 * 获得day天后的时间
	 * 
	 * @param day
	 * @return yyyy-MM-dd
	 */
	public static long addDayToLong(int day) {
		Calendar ca = Calendar.getInstance();
		ca.setTime(new Date());
		ca.add(Calendar.DAY_OF_YEAR, day);
		return ca.getTimeInMillis();
	}

	/**
	 * 获得day小时之后的
	 * 
	 * @param day
	 * @return
	 */
	public static long addHour(Date date, int day) {
		Calendar ca = Calendar.getInstance();
		ca.setTime(date);
		ca.add(Calendar.HOUR_OF_DAY, day);
		return toLong(ca.getTime());
	}

	/**
	 * 获得day小时之后的
	 * 
	 * @param day
	 * @return
	 */
	public static long addHour(int hour) {
		return addHour(new Date(), hour);
	}

	/**
	 * 获取yyyyMMddmmss
	 * 
	 * @return
	 */
	public static String getDateStr() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddmmss");
		return sdf.format(new Date());
	}

	/**
	 * 前N天的00:00:00
	 * 
	 * @return
	 */
	public static String someDayAgo(int n) {
		Calendar now = Calendar.getInstance();
		now.add(Calendar.DAY_OF_MONTH, -n);
		return new SimpleDateFormat("yyyy-MM-dd 00:00:00").format(now.getTime());
	}

	/**
	 * 前一天的23:59:59
	 * 
	 * @return
	 */
	public static String oneDayAgo() {
		Calendar now = Calendar.getInstance();
		now.add(Calendar.DAY_OF_MONTH, -1);
		return new SimpleDateFormat("yyyy-MM-dd 23:59:59").format(now.getTime());
	}

	public static String longToString(long timer) {
		Date date = new Date(timer);
		return new SimpleDateFormat(BaseConstants.DATE_FORMAT).format(date);
	}

	public static String longToMillString(long times){
		Date date = new Date(times);
		return new SimpleDateFormat(BaseConstants.DATE_FORMAT_SSS).format(date);
	}
	/**
	 * 获取前几个月的第一天的00:00:00
	 * 
	 * @return
	 */
	public static String monthFirstDay(int num) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
		// 获取前月的第一天
		Calendar cal_1 = Calendar.getInstance();// 获取当前日期
		cal_1.add(Calendar.MONTH, -num);
		cal_1.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
		return format.format(cal_1.getTime());
	}

	/**
	 * 获取前几个月的最后一天的23:59:59
	 * 
	 * @return
	 */
	public static String monthLastDay(int num) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, -num);
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		Date date = calendar.getTime();
		return format.format(date);
	}

	/**
	 * 判断当前时间是否在当天
	 * @param date
	 * @return
	 */
	public static boolean isToday(Date date) {
		SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
		// 格式化为相同格式
		if (fmt.format(date).toString().equals(fmt.format(new Date()).toString())) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 获得之后的时间yyyy-MM-dd
	 * @param day
	 * @return
	 */
	public static String getFewDay(int day) {
		Date date = new Date();
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE, day);
		return (new SimpleDateFormat("yyyy-MM-dd")).format(cal.getTime());
	}
	/**
	 * 得到指定天数  +1天到凌晨
	 * @param args
	 * @return
	 */
	public static String getDays(int args) {
		Calendar calendar = Calendar.getInstance();
		Date date = new Date();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH, +args+1);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return sdf.format(calendar.getTime());
	}
	/**
	 * 得到当月的第一天
	 * @param args
	 * @return
	 */
	public static String getfirstDayOfMonth() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
		return sdf.format(calendar.getTime());
	}
	/**
	 * 得到当月的最后一天
	 * @param args
	 * @return
	 */
	public static String getlastDayOfMonth() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		calendar.set(Calendar.MONTH, getMonth());
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
		return sdf.format(calendar.getTime());
	}
	
	public static void main(String args[]) {
		System.out.println(getlastDayOfMonth());
		
	}

}
